package org.sampleSpringFramework.util;

/**
 * 数据转换工具类
 */
public class ConvertUtil {

	/**
	 * 返回基本数据类型的空值
	 *需要特殊处理的基本类型即int\double\short\long\byte\float\boolean
	 * @param type 参数类型
	 * @return 对应的空值
	 */
	public static Object defaultConvert(Class<?> type) {
		if(type == byte.class || type == short.class ||
				type == int.class || type == long.class ||
				type == float.class || type == double.class){
			return 0;
		}else if(type == boolean.class){
			return false;
		}
		return null;
	}

	/**
	 * 将string类型的数据值，转成指定的数据类型，例如将string类型的"1"转换成int类型的1
	 * @param type 数据类型
	 * @param value 数据值
	 * @return 转换后的数据值
	 */
	public static Object paramConvert(Class<?> type, String value) {
		if(isPrimitive(type)){
			if(ValidationUtil.isEmpty(value)){
				return defaultConvert(type);
			}
			if (type.equals(int.class) || type.equals(Integer.class)) {
				return Integer.parseInt(value);
			} else if (type.equals(String.class)) {
				return value;
			} else if (type.equals(Double.class) || type.equals(double.class)) {
				return Double.parseDouble(value);
			} else if (type.equals(Float.class) || type.equals(float.class)) {
				return Float.parseFloat(value);
			} else if (type.equals(Long.class) || type.equals(long.class)) {
				return Long.parseLong(value);
			} else if (type.equals(Boolean.class) || type.equals(boolean.class)) {
				return Boolean.parseBoolean(value);
			} else if (type.equals(Short.class) || type.equals(short.class)) {
				return Short.parseShort(value);
			} else if (type.equals(Byte.class) || type.equals(byte.class)) {
				return Byte.parseByte(value);
			}
			return value;//返回原值（实际上并不会执行到，因为自研框架暂时不支持其他高级数据类型）
		} else {
			throw new RuntimeException("自研MVC框架暂时只支持：boolean/byte/short/int/long/float/double/String");
		}
	}

	/**
	 * 判定是否基本数据类型(包括包装类以及String)
	 *
	 * @param type 参数类型
	 * @return 是否为基本数据类型
	 */
	private static boolean isPrimitive(Class<?> type) {
		return type == boolean.class
				|| type == Boolean.class
				|| type == double.class
				|| type == Double.class
				|| type == float.class
				|| type == Float.class
				|| type == short.class
				|| type == Short.class
				|| type == int.class
				|| type == Integer.class
				|| type == long.class
				|| type == Long.class
				|| type == String.class
				|| type == byte.class
				|| type == Byte.class
				|| type == char.class
				|| type == Character.class;
	}
}
